# -*- encoding: utf-8 -*-

"""
------------------------------------------
@File       : coroutine_run_in_order.py
@Author     : maixiaochai
@Email      : maixiaochai@outlook.com
@CreatedOn  : 2021/9/16 15:36
------------------------------------------
    这段代码定义了两个协程，并将它们放到另外一个协程 main 函数中，
    想要获得它们运行的结果，事件循环的特点是当它遇到某个 I/O 需要等待 (如这里的 asyncio.sleep() 函数) 的时候，可以去执行其它的函数
"""
from time import time
from asyncio import sleep, get_event_loop


async def test_a(x):
    print('in test a')
    await sleep(3)
    print('resuming a')
    return x


async def test_b(x):
    print('in test b')
    await sleep(1)
    print('resuming b')
    return x


async def main():
    start = time()
    result_a = await test_a(1)
    result_b = await test_b(2)

    time_cost = round(time() - start, 2)
    print(f"test a's result is {result_a}")
    print(f"test b's result is {result_b}\n")
    print(f"Time cost: {time_cost} s")


if __name__ == '__main__':
    """
        这里，先执行了 test_a 函数，然后再执行了 test_b 函数，是串行的依次执行的，并没有像我们想象中的并发执行
        Out:
            in test a
            resuming a
            in test b
            resuming b
            test a's result is 1
            test b's result is 2
            
            Time cost: 4.0 s
    """
    loop = get_event_loop()
    loop.run_until_complete(main())
